package com.songyang.blog.util;

import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

/**
 * 验证码
 */
@Component
public class CheckCodeUtil {
    private static final String checkCodeKey = "checkCode";

    public static void getCheckCode(HttpServletRequest request, HttpServletResponse response) {
        try {
            String CheckCode = "";
            int width = 100;
            int height = 38;
            int fontSize = 22;
            response.setHeader("Cache-Control", "no-store");//告诉浏览器不要缓存这个
            response.setContentType("image/jpeg");//告诉浏览器这是个图片
            BufferedImage verifyImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//生成对应宽高的初始图片
            Graphics2D graphics = (Graphics2D) verifyImg.getGraphics();
            graphics.setColor(Color.WHITE);//设置画笔颜色-验证码背景色
            graphics.fillRect(0, 0, width, height);//填充背景
            graphics.setFont(new Font("微软雅黑", Font.BOLD, fontSize));
            //数字的组合
            String baseNumLetter = "123456789";
            StringBuffer sBuffer = new StringBuffer();
            int x = 10;  //旋转原点的 x 坐标
            String ch = "";
            Random random = new Random();
            for (int i = 0; i < 4; i++) {
                graphics.setColor(getRandomColor());
                //设置字体旋转角度
                int degree = random.nextInt() % 50;  //角度小于30度
                int dot = random.nextInt(baseNumLetter.length());
                ch = baseNumLetter.charAt(dot) + "";
                CheckCode = CheckCode + ch;
                sBuffer.append(ch);
                //正向旋转
                graphics.rotate(degree * Math.PI / 180, x, 18);
                graphics.drawString(ch, x, 20);
                //反向旋转
                graphics.rotate(-degree * Math.PI / 180, x, 18);
                x += 20;
            }
            setSession(request, CheckCode);
            //画干扰线
            for (int i = 0; i < 4; i++) {
                // 设置随机颜色
                graphics.setColor(getRandomColor());
                // 随机画线
                graphics.drawLine(random.nextInt(width), random.nextInt(height),
                        random.nextInt(width), random.nextInt(height));
            }
            //添加噪点
            for (int i = 0; i < 20; i++) {
                int x1 = random.nextInt(width);
                int y1 = random.nextInt(height);
                graphics.setColor(getRandomColor());
                graphics.fillRect(x1, y1, 1, 1);
            }
            OutputStream os = response.getOutputStream(); //获取文件输出流
            ImageIO.write(verifyImg, "png", os);//输出图片流

            os.flush();
            os.close();//关闭流
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String getCheckCodeKey() {
        return checkCodeKey;
    }

    private static void setSession(HttpServletRequest request, String CheckCode) {
        HttpSession session = request.getSession();
        session.setAttribute(checkCodeKey, CheckCode);
//        System.out.println("set:"+CheckCode);
    }

    private static Color getRandomColor() {
        Random ran = new Random();
        return new Color(ran.nextInt(256), ran.nextInt(256), ran.nextInt(256));
    }


}
